-- @owner: @nanyang12
-- @date: 2025/4/1
-- @testpoint:使用postgresql风格创建自定义函数，函数带IMMUTABLE等参数，指定language为pltsql

-- 连接D库
@conn PrimaryDbDmode;
-- 创建一个名为 add_numbers 的函数，IMMUTABLE选项
CREATE OR REPLACE FUNCTION add_numbers(a INT, b INT)
RETURNS INT
IMMUTABLE
LANGUAGE pltsql AS $$
BEGIN
 RETURN a + b;
END;
$$;
/
-- 调用函数
SELECT add_numbers(3, 5);
--STABLE选项
-- 创建一个名为 count_table_rows 的函数
CREATE OR REPLACE FUNCTION count_table_rows(table_name TEXT)
RETURNS BIGINT
STABLE
LANGUAGE 'pltsql' AS $$
DECLARE
 row_count BIGINT;
BEGIN
 EXECUTE 'SELECT COUNT(*) FROM ' || quote_ident(table_name) INTO row_count;
 RETURN row_count;
END;
$$;
/
-- 调用函数，统计某个表的记录数
drop table if exists sales;
create table sales (
 sale_id serial primary key,
 sale_date date not null,
 amount numeric(10, 2) not null

);
insert into sales values (generate_series(1,1000),'2023-01-01',100.00);
SELECT count_table_rows('sales');
--VOLATILE 函数
-- 创建一个名为 generate_random_number 的函数
CREATE OR REPLACE FUNCTION generate_random_number()
RETURNS INT
VOLATILE
LANGUAGE pltsql AS $$
BEGIN
-- 生成一个 1 到 100 之间的随机整数
 RETURN floor(random() * 100) + 1;
END;
$$;
/
-- 调用函数
SELECT generate_random_number();
--清理环境
drop table if exists sales;
drop function add_numbers;
drop function count_table_rows;
drop function generate_random_number;
